java不理解“volatile”关键字
这是一个线程类
public class Processor extends Thread {
public boolean running = true;
public void run()
{
while (running)
{
System.out.println("Hello from " + Thread.currentThread().getName());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
这是主调用程序类
public class ProcessorInvoker {
public static void main(String[] args) {
Processor proc1= new Processor();
proc1.start(); // ---->assuming thread0
Processor proc2=new Processor();
proc2.start(); // ---->assuming thread1
proc1.running=false;
}
}
我对关键字volatile的理解是:当Processor类中的布尔变量不是volatile时,将该变量的值更改为“false”不会影响thread1,因为将值更改为false-->;程序1。thread1看不到running=false,因此thread1继续运行,但thread0停止
当布尔变量变得易变时,我的理解是,因为我将布尔变量的值更改为false,那么thread1也会看到更改,并将停止,但这不会发生在输出上。我看到了相同的输出,thread0停止,但thread1仍在运行。我想两条线都应该停下来。谁能帮我澄清一下吗?请告诉我哪里错了
# 1 楼答案
您有两个
Processor
实例,因此当您执行proc1.running=false;
时,您只会停止其中一个线程。您还需要调用proc2.running=false;
来停止proc2每个线程对象都有自己版本的实例变量
running
。您可以将这个变量设为静态,然后两者都将停止运行(假设线程运行并达到while条件,然后其他一些代码可能会将running
更改回true)当你的消息来源说其他线程应该看到一个易失性变量的最新值时,他们并不意味着其他线程(如
Thread
对象)已经更改了该变量的等效版本。这意味着,当其他执行线程尝试访问该变量时(无论是在Thread
对象中还是任何其他类型的对象中),它们将看到最新的值